package lanqiao;

public class 山 {
    public static void main(String[] args) {
        int n =0;
        for (long i =2020; i <=2022222022; i++) {
                if (isUp(i)){
                    n+=Manache(i);
//                    if (Manache(i)==1){
//                        System.out.println(i);
//                    }
                }
        }
        System.out.println(n);
    }

//
    public static boolean isUp(long n){
        String str = n+"";
        int c = str.length()%2==0? str.length()/2:str.length()/2+1;
        for (int i = 1; i <c ; i++) {
            if (str.charAt(i)<str.charAt(i-1)){
                return false;
            }
        }
        return true;
    }

    public static int Manache(long n){
        String str = n+"";
        char[] chars = manacherString(str);
        int[] arr = new int[chars.length];
        int R =-1;
        int C =-1;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < chars.length; i++) {
            arr[i] = i<R?Math.min(R-i,arr[C*2-i]):1;
            while (i + arr[i] < chars.length && i - arr[i] > -1){
                if (chars[i+arr[i]] == chars[i-arr[i]] ){
                   arr[i]++;
                }else {
                    break;
                }
            }
            if (i + arr[i] > R) {
                R = i + arr[i];
                C = i;
            }
            max = Math.max(max, arr[i]);
        }
        return max-1== str.length()?1:0;
    }

//        for (int i = 0; i != charArr.length; i++) {
//            pArr[i] = R > i ? Math.min(pArr[2 * C - i], R - i) : 1; // 不用验的，上来先拿到一个确定的半径值
//            while (i + pArr[i] < charArr.length && i - pArr[i] > -1) { // 扩
//                if (charArr[i + pArr[i]] == charArr[i - pArr[i]]) // 左边界往左一个和右边界向右加一个比较
//                    pArr[i]++; // 相等就扩1
//                else {
//                    break; // 不相等就跳出循环
//                }
//            }
//            if (i + pArr[i] > R) { // 更新R和C
//                R = i + pArr[i];
//                C = i;
//            }
//            max = Math.max(max, pArr[i]);
//        }
//        return max - 1;// 半径-1 等于 实际直接
//    }
    public static char[] manacherString(String str){
        char[] chars = str.toCharArray();
        char[] ch =new  char[chars.length*2+1];
        int n =0;
        for (int i = 0; i < ch.length; i++) {
           ch[i] =  (i & 1) == 0 ? '#' : chars[n++];
        }
        return ch;
    }
    //    public static char[] manacherString(String str) { // 在字符串每个字符中间插入 #
//        char[] charArr = str.toCharArray();
//        char[] res = new char[str.length() * 2 + 1];
//        int index = 0;
//        for (int i = 0; i != res.length; i++) {
//            res[i] = (i & 1) == 0 ? '#' : charArr[index++]; // 偶数位放#
//        }
//        return res;
//    }

}
